package compile;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/***
 *
 */
public class CommandUtil {

    /**
     *
     * @param cmd 命令，javac   还是 java命令
     * @param stdoutFile 标准输出内容的文件
     * @param stderrFile 标准错误的文件
     * @return 状态吗 正常结束是0  非正常结束是非0
     */
    public static int run(String cmd, String stdoutFile, String stderrFile) {
        try {
            /*
            Runtime是一个单例类
             */
            Process process = Runtime.getRuntime().exec(cmd);
            //stdoutFile!=null的时候，说明需要将javac的内容，重定向到这个文件里面
            if (stdoutFile != null) {
                //从process去获取到内容
                InputStream stdoutFrom = process.getInputStream();
                //准备好一会儿要进行写入
                FileOutputStream stdoutTo = new FileOutputStream(stdoutFile);

                while (true) {
                    //一个一个从stdoutFrom中读取元素
                    int ch = stdoutFrom.read();
                    if (ch == -1) {
                        break;
                    }
                    stdoutTo.write(ch);
                }
                //记得关闭资源
                stdoutFrom.close();
                stdoutTo.close();
            }
            //同上处理
            if (stderrFile != null) {
                InputStream stderrFrom = process.getErrorStream();
                FileOutputStream stderrTo = new FileOutputStream(stderrFile);
                while (true) {
                    int ch = stderrFrom.read();
                    if (ch == -1) {
                        break;
                    }
                    stderrTo.write(ch);
                }
                stderrFrom.close();
                stderrTo.close();
            }
            //exec 执行过程是异步的. 可以使用 waitFor 方法阻塞等待命令执行结束
            // 也就是等子进程都执行完了父进程才结束
            int exitCode = process.waitFor();
            return exitCode;
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        return 1;
    }

    public static void main(String[] args) {
        CommandUtil.run("javac", "stdout.txt", "stderr.txt");
    }
}
